home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / GW AdaEd 1.4.2 / GWAdaDemos / NYUDemos / TASK.ADA < prev    next >
Text File  |  1993-01-31  |  2KB  |  90 lines

  1. -- DEMONSTRATION PROGRAM:
  2. --   
  3. --     Producer Consumer Tasking example
  4. --
  5.  
  6. with text_io; use text_io;
  7. procedure tasker is
  8.  
  9. task buffer is
  10.   entry read  (c: out integer);
  11.   entry write (c: in integer);
  12. end;
  13.  
  14. task producer;
  15.  
  16. task consumer;
  17.  
  18. task body buffer is separate;
  19. task body producer is separate;
  20. task body consumer is separate;
  21.  
  22. begin
  23.   null;
  24. end tasker;
  25.  
  26. ------------------------------------------------------------------------
  27.  
  28. separate(tasker)
  29. task body buffer is
  30.   pool_size : constant integer := 3;
  31.   pool      : array(integer range 1..pool_size) of integer;
  32.   count     : integer range 0..pool_size := 0;
  33.   in_index, out_index : integer range 1..pool_size := 1;
  34. begin
  35.   loop
  36.     select
  37.       when count < pool_size =>
  38.     accept write (c: in integer) do
  39.       pool (in_index) := c;
  40.     end;
  41.     in_index := in_index mod pool_size + 1;
  42.     count := count + 1;
  43.     or
  44.       when count > 0 =>
  45.     accept read (c: out integer) do
  46.       c := pool (out_index);
  47.     end;
  48.     out_index := out_index mod pool_size + 1;
  49.     count := count - 1;
  50.      or
  51.     terminate;
  52.      end select;
  53.  
  54.    end loop;
  55.  
  56. end buffer;
  57.  
  58. ------------------------------------------------------------------------
  59.  
  60. separate(tasker)
  61. task body producer is
  62. begin
  63.   for count in 1 .. 6
  64.   loop
  65.     put_line("Entry call to write in buffer number: "
  66.         & integer'image(count));
  67.     buffer.write (count);
  68.     put_line("Entry call to write complete.");
  69.   end loop;
  70.   buffer.write (0);
  71. end producer;
  72.  
  73. ------------------------------------------------------------------------
  74.  
  75. separate(tasker)
  76. task body consumer is
  77.   use text_io;
  78.   count: integer;
  79. begin
  80.   loop
  81.     put_line("Entry call to read to get number.");
  82.     buffer.read (count);
  83.     exit when count = 0;
  84.     put_line("Entry call to read obtained number: "
  85.         & integer'image(count));
  86.   end loop;
  87. end consumer;
  88.  
  89. ------------------------------------------------------------------------
  90.